﻿#ifndef SCANWIDGET_H
#define SCANWIDGET_H

#include "devcommon_global.h"
#include "cominfo.h"
#include "widgets/defendertable.h"
#include "common.h"
#include "virusfiledetaildelegate.h"
#include "operationdelegate.h"

#include <QWidget>
#include <QObject>
#include <QResizeEvent>
#include <QtCore/QVariant>
#include <QApplication>
#include <QFrame>
#include <QListView>
#include <QProgressBar>
#include <QPushButton>
#include <QSpacerItem>
#include <QDateTime>
#include <QTimer>
#include <QVector>
#include <QThread>
#include <QCheckBox>
//#include <DFontSizeManager>
//#include <DApplicationHelper>
#include <QListView>
#include <QToolButton>
#include <QLabel>
#include <QStackedWidget>
//#include <QSpinner>
#include <QComboBox>
//#include <DGuiApplicationHelper>
//#include <DIconButton>
//DWIDGET_BEGIN_NAMESPACE
//class DSuggestButton;
//class DTipLabel;
//DWIDGET_END_NAMESPACE

#include <time.h>

class QVBoxLayout;
class QHBoxLayout;
class QLabel;
class QPushButton;

using namespace def::widgets;

class AntiVirusWork;
class DBusInvokerInterface;

/*
@classname:(ScanWidget)
@author：(mxz)
@discptions:(扫描子页面  就算点击全盘/快速/自定义扫描后进入界面)
@datatime:(04-29)
*/
class DEVCOMMONSHARED_EXPORT ScanWidget : public QWidget
{
    Q_OBJECT
public:
    explicit ScanWidget(AntiVirusWork *work, QWidget *parent = nullptr);
    ~ScanWidget();

    // 设置图表类型
    void setIconType(int nType);
    // 标题类型设置
    void setType(int nType, QString sPath, QString sVersion);
    // 扫描前的准备
    void preScan();

    // 设置扫描路径
    void setScanPath(QString sPath);
    // 设置扫描异常数据
    void setScanErrorNum(int nVal);
    // 设置扫描个数
    void setScanNum(int nValue);
    // 设置进度条的进度
    void setProgressValue(double dVal);
    // 启动定时器
    void startTimer();
    // 全部修复  隔离 信任的操作
    void allOPeration(Itemtype type);
    // 设置操作结果
    void setOperationResult(QString sPath, Itemtype type);
    // 写入扫描数据日志
    void writeScanDatalog();
    // 更新全选状态
    void updateCheckAllStaus();
    // 添加扫描出来的结果
    void appendFileInfo(QString sPath, QString detail);

    // 是否全部操作
    bool finishAllOperation();
    // 获得操作列表信息
    QList<int> getOperationinfo();

    // 文件操作  类型路径
    void operationFile(Itemtype type, QString sFilepath);

    // 判断可以操作的按钮状态
    bool checkOperationBtStatus();

    // 一行的单独操作
    Q_SLOT void singlRowOperation(QString filepath, Itemtype nType);

    // 创建日志的头文件标题
    void createLogTitle();

    // 当前行选中
    void currentRowClicked(QModelIndex index);

    // 停止操作
    void stopScan();

    // 结束页面
    void showFinishPage();

    // 添加没有没有操作的异常项目
    void addThreats();

    //　当前是否在操作中
    bool isCurrentOperating();

    // 处理中提示框
    void showOperatingTip();

    Q_SLOT void showOperatingTipHelp(int index, const QString &);

    // 表头点击排序
    Q_SLOT void sortByTableHeaderClicked(int index);

protected:
    void resizeEvent(QResizeEvent *event);
    bool eventFilter(QObject *obj, QEvent *event);

    void refreshElideText();

private:
    //初始化界面
    void initGUI();
    //初始化中间tableview布局
    QHBoxLayout *initTableWidget();

Q_SIGNALS:
    //返回上一层信号   即返回到扫描主页面
    void onBackpage();
    // 添加异常
    void onAddThreatsFile(QString spath);

    // 准备移除的异常
    void readRemoveThreatsFile(QString spath);
    // 再次扫描
    void scanAgain(int nType, QString sPath, QString sVersion);

    // 批量处理文件
    void senBatchOperation(QStringList list, int nType);
public slots:
    // 扫描结束
    void doScanFinishClick();
    // 重新扫描
    void doReScan();

    // 暂停 继续 点击
    void doTypeButtonClick();
    // 更新扫描时间
    void updateTime();
    // 全选
    void doCheckAllClick(int nStatus);
    // 立即修复
    void doRepairClick();
    // 立即隔离
    void doIsolationClick();
    // 立即添加信任
    void doTrustClick();

    //dbus *****************回馈信号****************
    // 接受扫描回调信号
    void doDissectionResult(QString sPath, double dProgress, int eType, QString sDetailInfo);
    // 扫描结束
    void doScanFinsh(QStringList list);
    // 修复回馈信号
    void doRepairResult(QString sPath);
    // 隔离回馈信号
    void doIsolationResult(QString sPath);
    // 信任回馈信号
    void doTruestResult(QString sPaths);
    // 单个check点击
    void doSingalCheckClick();

    // 完成按钮点击
    void doneButtonClick();

    // 执行按钮点击
    void execButtonClick();

    void changeSuggestStatus(int row, int status);

    void slotPresistenEditor(const QModelIndex &index);

    void onProgSettingTimer();
private:
    AntiVirusWork *m_antiViruswork;
    DBusInvokerInterface *m_monitorInterFaceServer; // 流量监控dbus类
    QPushButton *m_pbFinish; // 结束按钮
    QPushButton *m_pbRescan; // 重新扫描按钮
    QPushButton *m_pbType; // 暂停、继续、
    QLabel *m_titleLabel; // 标题
    QLabel *m_scanPath; // 扫描路径
    QLabel *m_Santime; // 扫描时间
    QLabel *m_errNum; // 发现异常
    QLabel *m_iconType; // 左上角图标
    QLabel *m_scanNum; // 扫描项目个数
    QTableView *m_tableView;
    QProgressBar *m_progressBar; // 精度条
    QTimer *m_t1; // 扫描计算定时器
    QComboBox *m_combobox; // 下拉框
    QPushButton *m_exec; // 执行按钮
    QCheckBox *m_checkAll; // 全选
    QStandardItemModel *m_model;
    QStackedWidget *m_stackwidget; // stack 栈有两个页面  第一页图  第二页表
    QPushButton *m_pbDone; // 完成按钮
    QString m_logName; // 日志名称
    QString m_scanPathInfo; // 扫描路径
    QString m_lastFileName; // 最后一个文件名陈
    QString m_currentScanName; // 当前扫描名称
    QString m_currentScanType; // 当前扫描名称 类型
    QString m_currentVersion; // 病毒库版本
    int m_currentType; // 当前类型
    int m_countTime; // 开始计算时间
    int m_totalError; // 异常总数
    int m_totalScan; // 扫描总数
    int m_operationCount; // 已经操作了的数量
    bool m_flagPause; // 暂停标识
    bool m_AhprotectorStopFlag; // 安恒病毒引擎停止标识
    QTimer *m_progSettingTimer; // 进度设置定时器
    QString m_scanningFilePath; // 当前扫描的文件路径
    double m_scanningProg; // 当前扫描进度
    bool m_isInScanningUI; // 是否处于正在扫描界面
    OperationDelegate *virusDelegate;
    QMap<int, bool> m_operationMap;
};

#endif // SCANWIDGET_H
